www.gusucode.com > mean shift 均值漂移算法的matlab实现 > mean shift 均值漂移算法的matlab实现/meanshiftsmooth.m
function B1 = meanshiftsmooth(A,hr,hs,method) %*------------------------------------------------------------------------- %* 作者 :pineapple 时间 :2007.5.23 %* 联系方式 :QQ (94031570) Email(fanjun6294832@163.com) %*------------------------------------------------------------------------- %* 函数: B = meanshiftsmooth(A,hr,hs,method) %* 输入参数: %* A: 待平滑的图像 %* hr: 均值平移算法中的值域窗宽 %* hs: 均值平移算法中的空域窗宽 %* method : 'guass' | 'flat'. 两种类型的核函数,默认为'guass' %* 输出参数: %* B: 平滑后的图像 if(nargin <4) method = 'guass'; end [row,col,dim] = size(A); A = double(A); if dim==1 disp('灰度图'); elseif dim==3 disp('彩色图'); A = A(:,:,1); else error('不知是何种图像!'); end B = A; if(hr <=0 | hs <=0) error('窗宽不能为负'); end % 只考虑离当前点距离在 2*hs 内的点 h = 2*hs; [kmatrix,row_matirx,col_matrix] = kernelmatrix(hs,method,h); for i = 1:row %5:5,% for j = 1:col %5:5, if (i- h -1)>=0 kleftup.row = 1; else kleftup.row = h + 2 - i; end if(j-h - 1)>=0 kleftup.col = 1; else kleftup.col = h + 2 - j; end if (row - i - h) >=0 krightdown.row = 2*h + 1; else krightdown.row = row - i + h +1; end if (col- j - h) >=0 krightdown.col = 2*h + 1; else krightdown.col = col - j + h +1; end s_weight = kmatrix(kleftup.row :krightdown.row,... kleftup.col:krightdown.col); row_matirx_temp = row_matirx(kleftup.row :krightdown.row,... kleftup.col:krightdown.col); col_matirx_temp = col_matrix(kleftup.row :krightdown.row,... kleftup.col:krightdown.col); Aleftup.row = i - (h +1 - kleftup.row); Aleftup.col = j - (h +1 - kleftup.col); Arightdown.row = i + (krightdown.row - h -1); Arightdown.col = j + (krightdown.col - h -1); r_A = A(Aleftup.row :Arightdown.row,... Aleftup.col:Arightdown.col); R_A = r_A - A(i,j); R_A = R_A.^2; r_weight = exp(-R_A./(hr.^2)); weight = r_weight.*s_weight; temp_row = sum(sum(weight.*row_matirx_temp)); temp_col = sum(sum(weight.*col_matirx_temp)); value = sum(sum(r_A.*weight)); value1 = sum(sum(weight)); B(i,j) = value/(value1+eps); end end B1 = uint8(B); %imshow(B1)